From: Florian Müllner Date: Sat, 7 Jun 2025 16:45:16 +0000 (+0200) Subject: status/accessibility: Export quick toggles X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~124^2^2~5 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=f2c8f8039ea6a499363d051a633d93ec2bb96980;p=gnome-shell.git status/accessibility: Export quick toggles Implement quick toggles for every accessibility feature that is currently exposed by the menu. Those toggles will eventually replace the menu when quick setting become configurable. However the login screen will use a dedicated accessibility menu (once again), which does not depend on the quick settings feature, so add the toggles now to allow implementing it. Part-of: --- diff --git a/data/gnome-shell-icons.gresource.xml b/data/gnome-shell-icons.gresource.xml index 79a7eba54..aa9bd5fb0 100644 --- a/data/gnome-shell-icons.gresource.xml +++ b/data/gnome-shell-icons.gresource.xml @@ -7,6 +7,7 @@ scalable/actions/cog-wheel-symbolic.svg scalable/actions/dark-mode-symbolic.svg scalable/actions/group-collapse-symbolic.svg + scalable/actions/high-contrast-symbolic.svg scalable/actions/notification-expand-symbolic.svg scalable/actions/ornament-check-symbolic.svg scalable/actions/ornament-dot-checked-symbolic.svg diff --git a/data/icons/scalable/actions/high-contrast-symbolic.svg b/data/icons/scalable/actions/high-contrast-symbolic.svg new file mode 100644 index 000000000..707c77723 --- /dev/null +++ b/data/icons/scalable/actions/high-contrast-symbolic.svg @@ -0,0 +1,2 @@ + + diff --git a/js/ui/status/accessibility.js b/js/ui/status/accessibility.js index 2a98374ac..b32fbe312 100644 --- a/js/ui/status/accessibility.js +++ b/js/ui/status/accessibility.js @@ -5,6 +5,7 @@ import St from 'gi://St'; import * as PanelMenu from '../panelMenu.js'; import * as PopupMenu from '../popupMenu.js'; +import {QuickToggle} from '../quickSettings.js'; const A11Y_SCHEMA = 'org.gnome.desktop.a11y'; const KEY_ALWAYS_SHOW = 'always-show-universal-access-status'; @@ -146,3 +147,183 @@ class ATIndicator extends PanelMenu.Button { return widget; } }); + +export const HighContrastToggle = GObject.registerClass( +class HighContrastToggle extends QuickToggle { + constructor() { + super({ + title: _('High Contrast'), + iconName: 'high-contrast-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: A11Y_INTERFACE_SCHEMA}); + settings.bind(KEY_HIGH_CONTRAST, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const MagnifierToggle = GObject.registerClass( +class MagnifierToggle extends QuickToggle { + constructor() { + super({ + title: _('Zoom'), + iconName: 'org.gnome.Settings-accessibility-zoom-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: APPLICATIONS_SCHEMA}); + settings.bind('screen-magnifier-enabled', + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const LargeTextToggle = GObject.registerClass( +class LargeTextToggle extends QuickToggle { + constructor() { + super({ + title: _('Large Text'), + iconName: 'font-x-generic-symbolic', + toggleMode: true, + }); + + this._settings = new Gio.Settings({schemaId: DESKTOP_INTERFACE_SCHEMA}); + this._updateChecked(); + + const toggledId = this.connect('notify::checked', () => { + if (this.checked) + this._settings.set_double(KEY_TEXT_SCALING_FACTOR, DPI_FACTOR_LARGE); + else + this._settings.reset(KEY_TEXT_SCALING_FACTOR); + }); + + this._settings.connectObject(`changed::${KEY_TEXT_SCALING_FACTOR}`, () => { + this.block_signal_handler(toggledId); + this._updateChecked(); + this.unblock_signal_handler(toggledId); + }); + this._settings.bind_writable(KEY_TEXT_SCALING_FACTOR, + this, 'reactive', + false); + } + + _updateChecked() { + const factor = this._settings.get_double(KEY_TEXT_SCALING_FACTOR); + const checked = factor > 1.0; + this.set({checked}); + } +}); + +export const ScreenReaderToggle = GObject.registerClass( +class ScreenReaderToggle extends QuickToggle { + constructor() { + super({ + title: _('Screen Reader'), + iconName: 'audio-speakers-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: APPLICATIONS_SCHEMA}); + settings.bind('screen-reader-enabled', + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const ScreenKeyboardToggle = GObject.registerClass( +class ScreenKeyboardToggle extends QuickToggle { + constructor() { + super({ + title: _('Screen Keyboard'), + iconName: 'org.gnome.Settings-keyboard-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: APPLICATIONS_SCHEMA}); + settings.bind('screen-keyboard-enabled', + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const VisualBellToggle = GObject.registerClass( +class VisualBellToggle extends QuickToggle { + constructor() { + super({ + title: _('Visual Alerts'), + iconName: 'dialog-information-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: WM_SCHEMA}); + settings.bind(KEY_VISUAL_BELL, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const StickyKeysToggle = GObject.registerClass( +class StickyKeysToggle extends QuickToggle { + constructor() { + super({ + title: _('Sticky Keys'), + iconName: 'preferences-desktop-keyboard-shortcuts-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: A11Y_KEYBOARD_SCHEMA}); + settings.bind(KEY_STICKY_KEYS_ENABLED, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const SlowKeysToggle = GObject.registerClass( +class SlowKeysToggle extends QuickToggle { + constructor() { + super({ + title: _('Slow Keys'), + iconName: 'preferences-desktop-keyboard-shortcuts-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: A11Y_KEYBOARD_SCHEMA}); + settings.bind(KEY_SLOW_KEYS_ENABLED, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const BounceKeysToggle = GObject.registerClass( +class BounceKeysToggle extends QuickToggle { + constructor() { + super({ + title: _('Bounce Keys'), + iconName: 'preferences-desktop-keyboard-shortcuts-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: A11Y_KEYBOARD_SCHEMA}); + settings.bind(KEY_BOUNCE_KEYS_ENABLED, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +}); + +export const MouseKeysToggle = GObject.registerClass( +class MouseKeysToggle extends QuickToggle { + constructor() { + super({ + title: _('Mouse Keys'), + iconName: 'preferences-desktop-keyboard-shortcuts-symbolic', + toggleMode: true, + }); + + const settings = new Gio.Settings({schemaId: A11Y_KEYBOARD_SCHEMA}); + settings.bind(KEY_MOUSE_KEYS_ENABLED, + this, 'checked', + Gio.SettingsBindFlags.DEFAULT); + } +});